package com.xherorlclass.config;

import com.xherorlclass.IdGenerator;
import com.xherorlclass.XherorlRpcBootstrap;
import com.xherorlclass.discovery.RegistryConfig;
import com.xherorlclass.loadbalancer.LoadBalancer;
import com.xherorlclass.loadbalancer.impl.RoundRobinLoadBalancer;
import com.xherorlclass.protection.CircuitBreaker;
import com.xherorlclass.protection.RateLimiter;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.net.SocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author ：Xherorl
 * @date ：Created in 2023/8/30 9:03
 * @description： 全局的配置类，代码配置-->xml配置-->默认项
 */
@Slf4j
@Data
public class Configuration {

    // 配置信息 --> 端口号
    private int port = 8094;

    // 配置信息 --> 应用程序的名字
    private String appName = "default";

    // 分组信息
    private String group = "default";

    // 配置信息-->注册中心
    private RegistryConfig registryConfig = new RegistryConfig("zookeeper://127.0.0.1:2181");

    // 配置信息-->序列化协议
    private String serializeType = "jdk";

    // 配置信息-->压缩使用的协议
    private String compressType = "gzip";

    // 配置信息-->id发射器
    public IdGenerator idGenerator = new IdGenerator(1, 2);

    // 配置信息-->负载均衡策略
    private LoadBalancer loadBalancer = new RoundRobinLoadBalancer();

    // 为每一个IP配置一个限流器
    private final Map<SocketAddress, RateLimiter> everyIpRateLimiter = new ConcurrentHashMap<>(16);

    // 为每一个IP配置一个断路器，熔断
    private final Map<SocketAddress, CircuitBreaker> everyIpCircuitBreaker = new ConcurrentHashMap<>(16);

    // 读取xml，dom4j
    public Configuration(){
        // 1、成员变量的默认配置项

        // 2、spi机制发现相关配置项
        SpiResolver spiResolver = new SpiResolver();
        spiResolver.loadFromSpi(this);

        // 3、读取xml获得上边的信息
        XmlResolver xmlResolver = new XmlResolver();
        xmlResolver.loadFromXml(this);

        // 4、编程配置项，XherorlRpcBootstrap提供
    }

    public static void main(String[] args) {
        Configuration configuration = new Configuration();
    }
}
